
// 告诉 SDL 不要重定义 main 函数（必须在包含任何头文件之前）
#define SDL_MAIN_HANDLED

#include "ui/mainwindow.h"
#include "player/AudioDecoder.h"
#include "player/AudioOutput.h"

#include <QApplication>
#include <QDebug>
#include <QThread>

// 音频测试函数
void testAudio(const QString& filePath) {
    qDebug() << "========== 音频播放测试 ==========";
    qDebug() << "测试文件：" << filePath;
    
    // 1. 创建音频解码器
    AudioDecoder decoder;
    
    if (!decoder.openAudio(filePath)) {
        qDebug() << "❌ 打开音频失败：" << decoder.getError();
        return;
    }
    
    qDebug() << "✅ 音频打开成功！";
    qDebug() << "  采样率：" << decoder.getSampleRate() << "Hz";
    qDebug() << "  声道数：" << decoder.getChannels();
    qDebug() << "  时长：" << decoder.getDurationMs() / 1000.0 << "秒";
    
    // 2. 创建音频输出
    AudioOutput audioOutput;
    
    if (!audioOutput.init(decoder.getSampleRate(), decoder.getChannels(), decoder.getSwrContext())) {
        qDebug() << "❌ 初始化音频输出失败！";
        return;
    }
    
    qDebug() << "✅ 音频输出初始化成功！";
    
    // 3. 开始播放
    audioOutput.play();
    qDebug() << "🎵 开始播放...";
    
    // 4. 解码并推送音频帧
    int frameCount = 0;
    bool isEof = false;
    
    while (!isEof) {
        AudioFrame frame = decoder.decodeFrame(isEof);
        
        if (frame.isValid()) {
            audioOutput.pushFrame(std::move(frame));
            frameCount++;
            
            if (frameCount % 100 == 0) {
                qDebug() << "已解码：" << frameCount << "帧，缓冲区大小：" << audioOutput.getBufferSize();
            }
            
            // 如果缓冲区满了，稍微等待
            while (audioOutput.isBufferFull()) {
                QThread::msleep(10);
            }
        }
    }
    
    qDebug() << "解码完成，共" << frameCount << "帧";
    
    // 5. 等待播放完成
    qDebug() << "等待播放完成...";
    while (audioOutput.getBufferSize() > 0) {
        QThread::msleep(100);
    }
    
    QThread::sleep(1);  // 额外等待1秒
    
    qDebug() << "✅ 播放完成！";
    audioOutput.stop();
    decoder.closeAudio();
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    
    // ==================== 音频测试开关 ====================
    // 设置为 true 测试音频，设置为 false 正常启动视频播放器
    bool enableAudioTest = false;  // 已完成音频测试，现在正常启动视频播放器
    QString testAudioFile = "D:/material/test.mp4";  // 你的测试文件路径
    // ====================================================
    
    if (enableAudioTest) {
        qDebug() << "🎵 音频测试模式";
        testAudio(testAudioFile);
        return 0;  // 测试完成后退出
    }
    
    // 正常启动视频播放器
    MainWindow w;
    w.show();
    return a.exec();
}
